/*
 * proses_sms.java
 *
 * Created on December 18, 2007, 4:27 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package sms_rac_v3;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.comm.*;


// Event Listerner Packages
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

// Input Output (I/O) Stream Packages
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;

// Utilities Packages
import java.util.Enumeration;
import java.util.StringTokenizer;
import java.util.TooManyListenersException;

// Utilities untuk Waktu
import java.util.Date;

// Untilities untuk Pattern
import java.util.regex.Pattern;

/**
 *
 * @author Rachmad
 */
public class proses_sms implements SerialPortEventListener {
    
    /** Creates a new instance of proses_sms */
    public proses_sms() {
       // koneksiDB.sambungDB();
        //setTerminal();
        //prosesMulai();
    }
  public static void main(String args[]){
      //proses_sms psms = new proses_sms();
  }
  
 // Deklarasi variabel Serial Port
  SerialPort port = null;
  Enumeration portList = null;
  CommPortIdentifier portId = null;
  InputStream input;
  OutputStream output;
  String portName = null; // Nama Port
  int nilaiBaud = 19200; // Nilai Baud Rate
  int nilaiData = SerialPort.DATABITS_8; // Nilai DATABITS
  int nilaiStop = SerialPort.STOPBITS_1; // Nilai STOPBITS
  int nilaiParity = SerialPort.PARITY_NONE; // Nilai PARITY
  int nilaiFlow = SerialPort.FLOWCONTROL_NONE; // Nilai FLOWCONTROL
  int statusServer = 1; // Status penyambungan server
  public static int i=-1;
  
  /**
   * Methode setTerminal
   * Keterangan : penyambungan dan pengaturan terminal
   */
   // Awal methode setTerminal
  public void setTerminal() {
    portName = "COM5"; // Set nama port yang dipakai
    // Cetak pesan ke layar
    simpan_kirim.proses.add("Server Sedang melakukan pencarian Port", ++i);
    System.out.println("Server Sedang melakukan pencarian Port");
    // Mencari daftar port-port yang tersedia
    try{
    Enumeration portList = CommPortIdentifier.getPortIdentifiers();
    while (portList.hasMoreElements()) {
      // Mengambil nilai-nilai port yang ditemukan
      CommPortIdentifier portId = (CommPortIdentifier) portList.nextElement();
      // Hanya Port Serial yang diambil
      if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
        // Buka port berdasarkan nama port yang telah ditentukan (COM1)
        if (portId.getName().equals(portName)) {
          try {
            port = (SerialPort) portId.open("SMS", 5000);
            // Cetak pesan ke layar
            //proses.add("Server berhasil membuka Port : " + portName, ++i);
            //proses.select(i);
            System.out.println("Server berhasil membuka Port : " + portName);
            simpan_kirim.proses.add("Server berhasil membuka Port : " + portName, ++i);
            simpan_kirim.proses.select(i);

          } //Akhir try open port
          catch (PortInUseException piue) {
            simpan_kirim.proses.add("Port : " + portName + " Sedang digunakan", ++i);
            simpan_kirim.proses.add("Penyambungan ke Terminal Gagal .........", ++i);
            simpan_kirim.proses.add("Terjadi kesalahan pada : " + piue, ++i);
            simpan_kirim.proses.select(i);
            
            System.out.println("Port : " + portName + " Sedang digunakan");
            System.out.println("Penyambungan ke Terminal Gagal .........");
            System.out.println("Terjadi kesalahan pada : " + piue);
          } //Akhir catch
        } //Akhir if port getName
      } // Akhir if port getPortType
    } // Akhir while
    }catch(Exception ex){
        System.out.println("Port Tidak Ditemukan!!!!");
        System.out.println("Kesalahan :"+ ex);
    }
    // Membuka input dan output Stream pada Port
    try {
      output = port.getOutputStream();
      input = port.getInputStream();
    } // Akhir try stream
    catch (IOException ioe) {
      simpan_kirim.proses.add("Gagal membuka Stream", ++i);
      simpan_kirim.proses.add("Terjadi kesalahan pada : " + ioe, ++i);
      simpan_kirim.proses.select(i);
      
        System.out.println("Gagal membuka Stream");
        System.out.println("Terjadi kesalahan pada : " + ioe);
       
       
    } //Akhir catch
    // Mengatur Konfigurasi dari Serial Port
    try {
      port.setSerialPortParams(nilaiBaud, nilaiData, nilaiStop, nilaiParity);
      port.setFlowControlMode(nilaiFlow);
      // Menerima pemberitahuan jika ada data pada terminal
      port.notifyOnDataAvailable(true);

      // Cetak pesan ke layar
      simpan_kirim.proses.add("Server Melakukan Hubungan ke Port : " + portName, ++i);
      simpan_kirim.proses.add("Server Berhasil Tehubung ke Port : " + portName, ++i);
      simpan_kirim.proses.add("Server Sedang melakukan Pengaturan Terminal", ++i);
      simpan_kirim.proses.add("Tunggu Sebentar .....", ++i);
      simpan_kirim.proses.select(i);
      
       System.out.println("Server Melakukan Hubungan ke Port : " + portName);
       System.out.println("Server Berhasil Tehubung ke Port : " + portName);
       System.out.println("Server Sedang melakukan Pengaturan Terminal");
       System.out.println("Tunggu Sebentar .....");
          

      // Melakukan pengatur TERMINAL
      kirimAT("AT" + "\15", 1250); // Apakah terminal telah siap
      kirimAT("AT+CMGF=0" + "\15", 1250); // Menetapkan Format PDU Mode
      kirimAT("AT+CSCS=GSM" + "\15", 1250); // Menetapkan Encoding
      kirimAT("AT+CPMS=MT,MT,MT"+"\15",1250);//MENENTUKAN BACA PESAN DI MEMORI HP
      kirimAT("AT+CNMI=1,1,2,2,1" + "\15", 1250); // Mendengarkan Pesan secara Otomatis
      kirimAT("AT+CMGL=0" + "\15", 1250); // Membaca Pesan yang belum dibaca yang ada di dalam Inbox

      
      statusServer = 2;// Status server Terminal telah tersambung
      
    } //Akhir try serial port params
    catch (UnsupportedCommOperationException ucoe) {
      simpan_kirim.proses.add("Pengaturan Data Serial Port Gagal", ++i);
      simpan_kirim.proses.add("Kesalahan terjadi pada : " + ucoe, ++i);
      simpan_kirim.proses.select(i);
       System.out.println("Pengaturan Data Serial Port Gagal");
       System.out.println("Kesalahan terjadi pada : " + ucoe);
       
    }
    // Menambahkan Event Listener pada Serial Port
    try {
      port.addEventListener(this);
    } //Akhir try addEvenListener
    catch (TooManyListenersException tmle) {
      simpan_kirim.proses.add("Terjadi kesalahan pada : " + tmle, ++i);
      simpan_kirim.proses.select(i);
        System.out.println("Terjadi kesalahan pada : " + tmle);
       
    }

  } // Akhir Methode setTerminal
 
  
 
   /**
   * Methode balikKarakter
   * Keteranga : membalik atau menukar posisi sebuah nilai (2 karakter)
   * @param  : karakter = nilai yang akan dibalik
   * @return : stringBuffer
   */
  // Deklarasi variabel
  static int panjangKarakter = 0;
  static StringBuffer stringBuffer = null;

  // Awal methode balikKarakter
  public static String balikKarakter(String karakter) {
    panjangKarakter = karakter.length();
    stringBuffer = new StringBuffer(panjangKarakter);
    for (int i = 0; (i + 1) < panjangKarakter; i = i + 2) {
      stringBuffer.append(karakter.charAt(i + 1));
      stringBuffer.append(karakter.charAt(i));
    }
    return new String(stringBuffer);
  } // Akhir methode balikKarakter
  /**
   * Methode rubahKeHexa
   * Keterangan : Konversi nilai Desimal menjadi Hexadesimal
   * @param a : nilai desimal yang akan dikonversi
   * @return : karakter
   */
  // Deklarasi variabel
  static char[] hexa;
  static char[] karakter;

  // Awal methode rubahKeHexa
  public static String rubahKeHexa(int a) {
    char[] hexa = {
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
        'E', 'F'};

    karakter = new char[2];
    // Mengambil hanya 8 bit 255d = 11111111 b
    a = a & 255;
    // hasil pembagian dengan 16
    karakter[0] = hexa[a / 16];
    // sisa hasil pembagian dengan 16
    karakter[1] = hexa[a % 16];

    return new String(karakter);
  } // Akhir Methode rubahKeHexa
  /**
   * Methode delapanKeTujuhBit
   * Keterangan : Merubah 8 bit menjadi 7 bit (GSM ke ASCII)
   * @param pesan  : pesan SMS yang akan dirubah
   * @param msglen : panjang pesan SMS
   * @return : msg
   */
  // Deklarasi variabel
  static char[] gsmToAsciiMap; // GSM ==> ASCII

  // Awal methode delapanKeTujuhBit
  public static String delapanKeTujuhBit(String pesan, int msglen) {
    int i, o, r = 0, rlen = 0, olen = 0, charcnt = 0;
    StringBuffer msg = new StringBuffer(160);
    int pesanlen = pesan.length();
    String ostr;
    char c;

    // pengulangan hingga nilai terpenuhi
    // i + 1 < pesanlen dan charcnt < msglen
    for (i = 0; ( (i + 1) < pesanlen) && (charcnt < msglen); i = i + 2) {
      // mengambil dua digit Hexadesimal
      ostr = pesan.substring(i, i + 2);
      o = Integer.parseInt(ostr, 16);
      // berikan nilai olen = 8
      olen = 8;

      // geser posisi semua bit ke kiri sebanyak rlen bit
      o <<= rlen;
      o |= r; // berikan sisa bit dari o ke r
      olen += rlen; // olen = olen + rlen

      c = (char) (o & 127); // mendapatkan nilai o menjadi 7 bit
      o >>>= 7; // geser posis bit ke kanan sebanyak 7 bit
      olen -= 7;

      r = o; // menaruh sisa bit dari o ke r.
      rlen = olen;

      c = gsmToAsciiMap[c]; // rubah ke Text (kode ASCII)
      msg.append(c); // tambahkan ke msg
      charcnt++; // nilai charcnt ditambahkan 1

      // jika rlen >= 7
      if (rlen >= 7) {
        c = (char) (r & 127);
        r >>>= 7;
        rlen -= 7;
        msg.append(c);
        charcnt++;
      }
    } // Akhir for
    if ( (rlen > 0) && (charcnt < msglen)) {
      msg.append( (char) r);
    }
    return msg.toString();
  } // Akhir methode delapanKeTujuhBit
  /**
   * Methode tujuhKeDelapanBit
   * Keteranga : Merubah dari 7 bit menjadi 8 bit (ASCII ke GSM)
   * @param pesan : Pesan SMS yang akan dirubah
   * @return : encmsg
   */
  // Deklarasi variabel
  static char[] asciiToGsmMap; // ASCII ==> GSM

  // Awal methode tujuhKeDelapanBit
  public static String tujuhKeDelapanBit(String pesan) {

    StringBuffer msg = new StringBuffer(pesan);

    StringBuffer encmsg = new StringBuffer(2 * 160);
    int bb = 0, bblen = 0, i;
    char o = 0, c = 0, tc;

    for (i = 0; i < msg.length() || bblen >= 8; i++) {
      if (i < msg.length()) {
        c = msg.charAt(i);
        tc = asciiToGsmMap[c];

        c = tc;

        c &= ~ (1 << 7);
        bb |= (c << bblen);
        bblen += 7;
      }

      while (bblen >= 8) {
        o = (char) (bb & 255);
        encmsg.append(rubahKeHexa(o));
        bb >>>= 8;
        bblen -= 8;
      }
    }
    if ( (bblen > 0)) {
      encmsg.append(rubahKeHexa(bb));
    }
    return encmsg.toString();
  } // Akhir methode tujuhKeDelapanBit

  static {
    final int lastindex = 255;
    gsmToAsciiMap = new char[lastindex + 1];
    asciiToGsmMap = new char[lastindex + 1];
    int i;

    for (i = 0; i <= lastindex; i++) {
      gsmToAsciiMap[i] = asciiToGsmMap[i] = (char) i;
    }
  } // Akhir static
 /**
   * Methode PduTerimaSms
   * Keterangan : Merubah pesan SMS format PDU menjadi format teks
   * @param smspdu : nilai pesan SMS PDU yang akan dirubah
   */
  // Deklarasi variabel
  String infoSmsc = null;
  int nilaiSmsc = 0;
  int nomorSmsc = 0;
  String panjangNotlp = null;
  int nilaiPanjangNotlp = 0;
  int nilaiNotlp = 0;
  String Notlp = null;
  String dapatNotlp = null;
  String panjangPesan = null;
  int nilaiPanjangPesan = 0;
  String pesanPDU = null;
  String pesan = null;

  // Awal methode PduTerimaSms
  public void PduTerimaSms(String smspdu) {
    int i = 0;
    try {
      // Mengambil nilai panjang informasi SMSC
      infoSmsc = smspdu.substring(i, 2);
      nilaiSmsc = Integer.parseInt(infoSmsc, 16);
      // format nomor dan nomor MSC dibuang
      i = i + 4;
      nomorSmsc = i + (nilaiSmsc * 2) - 2;
      // Nilai PDU Type dibuang
      i = nomorSmsc + 2;
      // Mengambil Panjang Nomor Telepon Pengirim
      panjangNotlp = smspdu.substring(i, i + 2);
      nilaiPanjangNotlp = Integer.parseInt(panjangNotlp, 16);
      // format nomor pengirim dibuang
      i = i + 4;
      nilaiNotlp = i + nilaiPanjangNotlp + nilaiPanjangNotlp % 2;
      // Nomor telepon pengirim
      Notlp = smspdu.substring(i, nilaiNotlp);
      dapatNotlp = balikKarakter(Notlp);
      i = nilaiNotlp;
      // Nilai PID, DCS, dan SCTS dibuang
      i = i + 18;
      // Mengambil Panjang Pesan SMS
      panjangPesan = smspdu.substring(i, i + 2);
      nilaiPanjangPesan = Integer.parseInt(panjangPesan, 16);
      i = i + 2;
      pesanPDU = smspdu.substring(i, smspdu.length());
      pesan = delapanKeTujuhBit(pesanPDU, nilaiPanjangPesan);
    }
    catch (Exception e) {}
  } // Akhir Metode PduTerimaSms
 /**
   * Methode PduKirimSms
   * Keterangan : Merubah pesan SMS format teks menjadi format PDU
   * @param notlp  : Nomor telepon tujuan
   * @param pesan  : isi Pesan yang akan dikirim
   * @return : pesanPDUKirim
   */
  // Deklarasi Variabel
  static StringBuffer pesanPDUKirim = null;
  static int panjangNotlpTujuan = 0;
  static int panjangPesanKirim = 0;
  static String PduPesan = null;

  // Awal methode PduKirimSms
  public static String PduKirimSms(String notlp, String pesan) {
   try{
      System.out.println("pduKirirm sms dijalankan!");
       simpan_kirim.proses.add("pduKirirm sms dijalankan!", ++i);
       simpan_kirim.proses.select(i);
    pesanPDUKirim = new StringBuffer(320); // 320 = 160 * 2 (panjang max)
    // Tambahkan nilai PDU Type ---> Default = 11
    pesanPDUKirim.append("11");
    // Tambahkan nilai MR ---> Default = 00
    pesanPDUKirim.append("00");
    // Tambahkan nilai panjang nomor pengirim
    panjangNotlpTujuan = notlp.length();
    pesanPDUKirim.append(rubahKeHexa(panjangNotlpTujuan));
    // Tambah nilai format no. telepon --> format internasional = 91
    pesanPDUKirim.append("81");
    //pesanPDUKirim.append("91");
    // Tambahkan nilai nomor telepon pengirim
    // Jika panjang notlp adalah ganjil
    if ( (notlp.length() % 2) == 1) {
      notlp = balikKarakter(notlp + "F");
    }
    // Jika panjang notlp adalah genap
    else {
      notlp = balikKarakter(notlp);
    }
    pesanPDUKirim.append(notlp);
    // tambahkan nilai PID ---> Default = 00
    pesanPDUKirim.append("00");
    // tambahkan nilai DCS ---> Default = 00
    pesanPDUKirim.append("00");
    // tambahkan nilai VP = 4 hari ---> AA h
    pesanPDUKirim.append("AA");
    panjangPesanKirim = pesan.length();
    PduPesan = tujuhKeDelapanBit(pesan);
    pesanPDUKirim.append(rubahKeHexa(panjangPesanKirim));
    pesanPDUKirim.append(PduPesan);

   
   }catch (Exception ex){
   System.out.println("Ada kesalahan wak tu ubah pdu:"+ ex);
   }
    return new String(pesanPDUKirim);
  } // Akhir Methode PduKirimSms
/**
   * Methode kirimAT
   * Keterangan : Mengirim AT Command ke Terminal
   * @param atCmd  : Nilai AT Command
   * @param delay  : Waktu delay pengiriman AT Command
   */
  // Awal methode kirimAT
  public void kirimAT(String atCmd, int delay) {
    Boolean tungguDelay = new Boolean(true);
    boolean getDelay = false;
    // Membuat antrian proses
    synchronized (tungguDelay) {
      try {
        // Menulis AT Commmand
        output.write( (atCmd).getBytes());
        // Hapus OutputStream
        output.flush();
      } //Akhir Try
      catch (IOException e) {}
      try {
        tungguDelay.wait(delay);
      } // Akhir try
      catch (InterruptedException ie) {
        getDelay = true;
      } // Akhir catch
    } // Akhir syncronized
  } // Akhir Methode kirim AT
 
/**
   * Methode terimaAT
   * Keterangan : Memproses respon yang diterima dari terminal
   * @param buffer : respon dari terminal yang telah dibuang karakter CRLF
   */
  // Deklarasi variabel
  String[] hasil;
  int Index;
  int panjangPDU;
  int PDU = 0;
  String respons;
  StringTokenizer st;

  // Awal methode terimaAT
  public void terimaAT(String buffer) {
    // Menguraikan buffer berdasarkan karakter CRLF
    st = new StringTokenizer(buffer, "\r\n");

    while (st.hasMoreTokens()) {
      // mengambil token yang ada pada obyek
      respons = st.nextToken();
      // Cetak respon ke layar
      simpan_kirim.proses.add(respons, ++i);
      simpan_kirim.proses.select(i);
       System.out.println(respons);

      // Memproses respon yang diterima
      try {
        // Jika Ada Telepon yang Masuk
        if (respons.startsWith("RING")) {
          kirimAT("ATH0" + "\15", 100); // Diputuskan
        } // Akhir if "RING"

        // Jika ada Pesan Baru yang Masuk
        else if (respons.startsWith("+CMTI:")) {
          Pattern pattern = Pattern.compile(",");
          hasil = pattern.split(respons.trim());
          Index = Integer.parseInt(hasil[1].trim());
          kirimAT("AT+CMGR=" + Index + "\15", 1250); // Baca Pesan Baru yang Masuk
        } // Akhir if "+CMTI:"

        // Jika ada Pesan Baru Yang dibaca
        else if (respons.startsWith("+CMGR:")) {
          PDU = 1;
        } // Akhir if "+CMGR:"

        // Membaca Pesan Indox yang belum dibaca
        else if (respons.startsWith("+CMGL")) {
          Pattern pattern = Pattern.compile(":");
          hasil = pattern.split(respons.trim());
          pattern = Pattern.compile(",");
          hasil = pattern.split(hasil[1].trim());
          Index = Integer.parseInt(hasil[0].trim());
          PDU = 1;

        } // Akhir if "+CMGL"
        else if (PDU == 1) {
          prosesTerimaSms(Index, respons.trim());
          PDU = 0;
        }
        else {}
      }
      catch (Exception e) {} // Akhir while
    }
  } // Akhir Methode terimaAT
  /**
   * Methode prosesTerimaSms
   * Keterangan : Proses menerima pesan SMS yang masuk
   * @param Index : Nomor penyimpanan SMS pada SIM CARD
   * @param Pdu   : Pesan SMS dalam format PDU
   */
  // Awal methode prosesTerimaSms
  public void prosesTerimaSms(int Index, String Pdu) {
    try {
      // Rubah dari format PDU menjadi Format Teks
      PduTerimaSms(Pdu);
    } // Akhir try
    catch (Exception e) {}
    // Jika nomor telepon pengirim diakhiri dengan "F"
    if (dapatNotlp.endsWith("F")) {
      // Buang karakter "F"
      dapatNotlp = dapatNotlp.substring(0, dapatNotlp.length() - 1);
    }
    // Hapus Pesan yang Telah dibaca
    kirimAT("AT+CMGD=" + Index + "\15", 2000);
    // Tulis ke tabel TERIMA
    System.out.println("Lagi menulis pada tabel kotak_masuk");
    tulisDataTabelTerima(dapatNotlp, pesan);
    // Cetak ke Layar
    //dari.setText(" " + dapatNotlp);
    //isi.setText(" " + pesan);
    simpan_kirim.proses.add("Pesan Dari Nomor : " + dapatNotlp, ++i);
    simpan_kirim.proses.add("Isi Pesan : " + pesan, ++i);
    simpan_kirim.proses.select(i);
     
    System.out.println("Pesan Dari Nomor : " + dapatNotlp);
    System.out.println("Isi Pesan : " + pesan);
    
  } // Akhir Methode prosesTerimaSms
  /**
   * Methode tulisDataTabelTerima
   * Keterangan : Menulis data pesan SMS yang diterima ke tabel TERIMA
   * @param notlp : Nomor telepon pengirim
   * @param pesan : Isi pesan SMS (dalam format Teks)
   */
  // Deklarasi Variabel
  		Connection kon = null;
		ResultSet query = null;
  		
		//query = stm.executeQuery("select * from tb_psn_msk");
  
 static PreparedStatement pStatement = null;
 static String sql = null;

  // Awal methode tulisDataTabelTerima
  public  void tulisDataTabelTerima(String notlp, String pesan) {
    try {
      
        //Memasukan sms yang di terima ke tb_sms_tampung
        //int jml = koneksiDB.ambilJumlah("kotak_masuk");
        pStatement = koneksiDB.con.prepareStatement(
          "Insert Into kotak_masuk(pengirim,pesan) values('"+notlp+"','"+pesan+"');");
        pStatement.executeUpdate();
        pStatement.close();
        simpan_kirim.proses.add("Data Telah Ditulis pada Tabel kotak_masuk", ++i);
        simpan_kirim.proses.select(i);
        
        simpan_kirim.tampil(); //--> untuk refresh tabel pesan
        
      } // Akhir try
      catch (Exception ei) {
        System.out.println("ada kesalahan pada pengisisan data pada kotak masuk");
        System.out.println("Kesalahan :" + ei);
      }
      //System.out.println("Data Telah Ditulis pada Tabel tb_sms_masuk");
      
      
     
  } // Akhir Methode tulisDataTabelTerima
  /**
   * Methode ambilTerima
   * Keterangan : Mengambil data pesan SMS pada tebel TERIMA yang ber-STATUS Belum Diproses
   */
  // Deklarasi Variabel
  String dataId = null; // ID Pesan
  String dataNotlp = null; // Nomer Telepon Pengirim
  String dataPesan = null; // Isi Pesan

  // Awal methode ambilTerima
  public void ambilTerima() {
    try {
      // Statement SQL
      sql ="Select kode, pengirim, pesan From kotak_masuk Where sts=0";
      pStatement = koneksiDB.con.prepareStatement(sql);
      try {

        ResultSet rSet = pStatement.executeQuery();
        while (rSet.next()) {
          // Mengambil data dari tabel TERIMA
          dataId = rSet.getString("kode"); // ID Pesan
          dataNotlp = rSet.getString("pengirim"); // Nomer Telepon Pengirim
          dataPesan = rSet.getString("pesan"); // Isi Pesan
          // Berikan nilai ke methode prosesTabelTerima
          prosesTabelTerima(dataId, dataNotlp, dataPesan);

        } // Akhir while
        // Menutup Statement SQL
        pStatement.close();
      } // Akhir try ResultSet
      catch (Exception ie) {}
    } // Akhir try SQL
    catch (Exception e) {}
  } // Akhir Methode ambilTerima
  /**
   * Methode prosesTabelTerima
   * Keterangan : Memproses data pesan SMS yang diambil dari tebel TERIMA
   * @param id    : Nomor penyimpanan data pesan SMS pada tabel TERIMA
   * @param notlp : Nomor telepon pengirim
   * @param pesan : Isi pesan SMS
   */
  // Deklarasi variabel
  String kode1 = null;
  String kode2 = null;
  String kode3 = null;
  String kode_1_salah = null;
  String kode_1_format = null;
  String pesanSalahKode_1 = null;
  String perintah[] = new String[30];
  // Awal methode prosesTabelTerima
  public void prosesTabelTerima(String id, String notlp, String pesan) {
    // Menulis status dari Pesan TERIMA menjadi "Telah diProses"
    tulisStatusData(id, "1"); //1=telah diproses 2 -> telah dikirim

    // Melakukan Parsing (parameter parsing adalah SPASI)
    Pattern pattern = Pattern.compile(" ");
    hasil = pattern.split(pesan.trim());
   
  
  } // Akhir Methode prosesTabelTerima
// *****************************************************************************
// Proses menulis Hasil Query ke tabel KIRIM
  /**
   * Methode tulisDataTabelKirim
   * Keterangan : Menulis Data yang akan dikirim pada tabel TERIMA
   * @param notlp : Nomor telepon tujuan
   * @param dataKirim : Pesan yang akan dikirim
   */

  // Awal methode tulisDataTabelKirim
  public static void tulisDataTabelKirim(String notlp, String dataKirim) {
     // koneksiDB.tuliskeTabelKirim( notlp,  dataKirim);
   try {
      pStatement = koneksiDB.con.prepareStatement(
          "Insert Into tb_sms_kirim (no_tujuan,isi_sms,sts) Values ('"+notlp+"','"+dataKirim+"',0);");
      try {
        //pStatement.setString(1, notlp);
        //pStatement.setString(2, dataKirim);
        //pStatement.setString(3, "0");
        pStatement.executeUpdate();

      }
      catch (Exception ex) {
          System.out.println("kesalahan tulis tabel kirim1: "+ex);
      }
      pStatement.close();
      
    }
    catch (Exception e) {
    System.out.println("kesalahan tulis tabel kirim2: "+e);}
   
      
  } // Akhir Methode tulisDataTabelKirim

  /**
   * Methode ambilKirim
   * Keterangan : Mengambil data pesan SMS pada tebel KIRIM yang ber-STATUS Belum Dikirim
   */
  // Deklarasi Variabel
  String idKirim = null;
  String notlpKirim = null;
  String pesanKirim = null;

  // Awal methode ambilKirim
  public void ambilKirim() {
    try {
      // Statement SQL
      String sql =
          "Select kode_sms, no_tujuan, isi_sms From tb_sms_kirim Where sts=0";
      pStatement = koneksiDB.con.prepareStatement(sql);
      try {

        ResultSet rSet = pStatement.executeQuery();
        while (rSet.next()) {
          // Mengambil data dari tabel TERIMA
          idKirim = rSet.getString("kode_sms"); // ID Pesan
          notlpKirim = rSet.getString("no_tujuan"); // Nomer Telepon Pengirim
          pesanKirim = rSet.getString("isi_sms"); // Isi Pesan
          /*proses.add(
              "Server Mengambil Data yang belum dikirim pada Tabel KIRIM",
              ++i);
          proses.select(i);
           **/
          // Berikan nilai ke methode prosesTabelTerima
          prosesKirimSms(idKirim, notlpKirim, pesanKirim);

        } // Akhir while
        // Menutup Statement SQL
        pStatement.close();
      } // Akhir try ResultSet
      catch (Exception ie) {}
    } // Akhir try SQL
    catch (Exception e) {System.out.println("Kesalahan ambilKirim; "+e);}
  } // Akhir Methode ambilKirim

  /**
   * Methode prosesKirimSms
   * Keterangan : Mengirim Pesan SMS
   * @param id : Nomor Penyimpanan data pesan SMS pada tabel KIRIM
   * @param notlp : Nomor telepon tujuan
   * @param pesan : pesan SMS yang dikirim
   */

  // Awal methode prosesKirimSms
  public void prosesKirimSms(String id, String notlp, String pesan) {
    try {
      // Menulis status pesan Tebel KIRIM menjadi "Telah Dikirim"
     // tulisStatusData(id, "2");
      System.out.println("ProsesKirirm SMS dijalankan");
      // Merubah pesan menjadi Format PDU (Protocol Data Unit)
      String pesanPDUKirim = PduKirimSms(notlp.trim(), pesan.trim());
      System.out.println("PDUnya: "+pesanPDUKirim);
      // Proses Mengirim Pesan
      kirimAT("AT+CMGS=" + (pesanPDUKirim.length() / 2) + "\15", 500);
      kirimAT("00" + pesanPDUKirim, 2500); // Kirim Pesan Format PDU
      kirimAT("\032", 100); // Ctrl + Z
     
      // Menulis ke layar
     
      //kirim.setText(" Kirim ke : +" + notlp);
      //balas.setText(pesan + "\nSTATUS : TELAH DIKIRIM");
      simpan_kirim.proses.add("Kirim ke : +" + notlp, ++i);
      simpan_kirim.proses.add("Isi Pesan Balasan : ", ++i);
      simpan_kirim.proses.add(pesan, ++i);
      simpan_kirim.proses.add("Status : TELAH DIKIRIM", ++i);
      simpan_kirim.proses.select(i);
      
      simpan_kirim.proses.add("Tunggu sebentar HP belumsiap", ++i);
      simpan_kirim.proses.select(i);
      
      // Berikan waktu sleep agar terminal siap kembali untuk mengirim pesan
      Thread.currentThread().sleep(5500);
      
        //tulisStatusData(id, "2");
    } // Akhir try

    catch (Exception e) {}
  } // Akhir Methode prosesKirimSms
   public  void KirimSms(String notlp, String pesan) {
    try {
      // Menulis status pesan Tebel KIRIM menjadi "Telah Dikirim"
     // tulisStatusData(id, "2");
      System.out.println("ProsesKirirm SMS dijalankan");
      // Merubah pesan menjadi Format PDU (Protocol Data Unit)
      String pesanPDUKirim = PduKirimSms(notlp.trim(), pesan.trim());
      System.out.println("PDUnya: "+pesanPDUKirim);
      // Proses Mengirim Pesan
      kirimAT("AT+CMGS=" + (pesanPDUKirim.length() / 2) + "\15", 500);
      kirimAT("00" + pesanPDUKirim, 2500); // Kirim Pesan Format PDU
      kirimAT("\032", 100); // Ctrl + Z
     
      // Menulis ke layar
     
      //kirim.setText(" Kirim ke : +" + notlp);
      //balas.setText(pesan + "\nSTATUS : TELAH DIKIRIM");
      simpan_kirim.proses.add("Kirim ke : +" + notlp, ++i);
      simpan_kirim.proses.add("Isi Pesan : ", ++i);
      simpan_kirim.proses.add(pesan, ++i);
      simpan_kirim.proses.add("Status : TELAH DIKIRIM", ++i);
      simpan_kirim.proses.select(i);
      
      //simpan_kirim.proses.add("Tunggu sebentar HP belumsiap", ++i);
     // simpan_kirim.proses.select(i);
      
      // Berikan waktu sleep agar terminal siap kembali untuk mengirim pesan
      //Thread.currentThread().sleep(5500);
      
        //tulisStatusData(id, "2");
    } // Akhir try

    catch (Exception e) {}
  } // Akhir Methode prosesKirimSms

// *****************************************************************************
// Menulis STATUS dari data yang ada pada tabel TERIMA dan KIRIM
  /**
   * Methode tulisStatusData
   * Keterangan : melakukan update atau pemuktahiran terhadap status data
   *              pada tabel TERIMA dan KIRIM yang telah berhasil diproses
   * @param id : Nomor Penyimpanan data pesan SMS pada tabel KIRIM
   * @param status : Status Data
   */

  // Awal methode tulisStatusData
  public void tulisStatusData(String id, String status) {
    String tulisStatus = null;
    try {
      // Jika status pesan "Telah Dikirim"
      if (status.equals("2")) { // 2 -> telah dikirim
        tulisStatus = "Update tb_sms_kirim Set sts=2 Where kode_sms=?";
      }
      // Jika status pesan "Telah Diproses"
      if (status.equals("1")) { // 1 -> telah diproses
        tulisStatus = "Update tb_sms_tampung Set status=1 Where kode_sms=?";
      }
      // SQL
      pStatement = koneksiDB.con.prepareStatement(tulisStatus);
      try {
        pStatement.setString(1, id);
        pStatement.executeUpdate();
      } // Akhir try
      catch (Exception e) {}
      // Menutup Statement
      pStatement.close();
    } // Akhir try
    catch (Exception e) {System.out.println("Kesalahan tulis status data:"+e);}
  } // Akhir Methode tulisStatusData
 /**
   * Methode prosesMulai
   * Keterangan : Menjalankan SMS Server
   */

  // Awal Methode prosesMulai
  public void prosesMulai() {
    //setDatabase();
    if (statusServer == 1) {
      //setTerminal();
      setTerminal();
      if (statusServer == 2) {
        //prosesJam jam = new prosesJam();
       // ThreadAmbilDataKirim kirim = new ThreadAmbilDataKirim();
        ThreadAmbilDataTerima terima = new ThreadAmbilDataTerima();
        //jam.start();
        //kirim.start(); //untuk kirim otomatis
        terima.start(); //nanti aktifkan lagi
        //this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
      }
    }

  } // Akhir Methode prosesMulai
  
 
  
  
// ********************************************************************
// Class Untuk selalu memanggil methode Jam
  class prosesJam
      extends Thread {
    public prosesJam() {

    } // Akhir Methode prosesJam

    public void run() {
      while (true) {
        //Jam();
        try {
          Thread.sleep(1000);
        } // Akhir try
        catch (InterruptedException e) {}
      } // Akhir while
    } //Akhir Methode run
  } // Akhir class prosesJam

// *********************************************************************
// Class Untuk selalu memanggil methode ambilTerima()
  class ThreadAmbilDataTerima
      extends Thread {
    public ThreadAmbilDataTerima() {
    } // Akhir Methode ThreadAmbilDataTerima

    public void run() {
      while (true) {
        ambilTerima();
        try {
          Thread.sleep(3000);
        } // Akhir try
        catch (InterruptedException e) {}
      } // Akhir while
    } //Akhir Methode run
  } // Akhir class ThreadAmbilDataTerima

// **********************************************************************
// Class Untuk Selalu memanggil methode ambilKirim()
  class ThreadAmbilDataKirim
      extends Thread {
    public ThreadAmbilDataKirim() {
    } // Akhir Methode ThreadAmbilDataKirim

    public void run() {
      while (true) {
       // ambilKirim();
        try {
          Thread.sleep(2000);
        } // Akhir try
        catch (InterruptedException e) {}
      } // Akhir while
    } //Akhir Methode run
  } // Akhir class ThreadAmbilDataKirim
// ***************************************************************************
  // Serial Event
  // Serial Port Listener
  /**
   * Methode serialEvent
   * Keterangan : menerima respon dari terminal
   * @param event = reapon yang diterima terminal
   */
  // Deklarasi variabel
  int bufferOffset = 0;
  byte[] bacaBuffer = new byte[100000];
  int n;

  // Awal methode serialEvent
  public void serialEvent(SerialPortEvent event) {
    try {
      // Apabila ada respons dari terminal, lakukan pembacaan
        //ini lagi coba penanganan multi port event
     /*   if(event.equals(portId.getName()))
        {
        
        }
        */
        //akhir dari lagi coba 
       // System.out.println("nama port yng ada event -> "+port.getName()); 
      while ( (n = input.available()) > 0) {
        n = input.read(bacaBuffer, bufferOffset, n);
        bufferOffset += n;

        // Jika ada respons "\15" (Line Feed Carriage Return),
        if ( (bacaBuffer[bufferOffset - 1] == 10) &&
            (bacaBuffer[bufferOffset - 2] == 13)) {
          String buffer = new String(bacaBuffer, 0, bufferOffset - 2);
          // Berikan ke methode terimaAT
          terimaAT(buffer);
          
          bufferOffset = 0;
        } // Akhir if
      } // Akhir while
    } // Akhir try
    catch (IOException e) {
        System.out.println(e);
    }
  } // Akhir methode serialEvent
    //Metod untuk pengisian pulsa

}
